package runLife;
/**
 * 静态代码优先于非静态的代码，是因为被static修饰的成员都是类成员，会随着JVM加载类的时候加载而执行，而没有被static修饰的成员也被称为实例成员，需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。 
执行构造器（构造方法）的时候，在执行方法体之前存在隐式三步： 
1，super语句，可能出现以下三种情况： 
1）构造方法体的第一行是this语句，则不会执行隐式三步， 
2）构造方法体的第一行是super语句，则调用相应的父类的构造方法， 
3）构造方法体的第一行既不是this语句也不是super语句，则隐式调用super()，即其父类的默认构造方法，这也是为什么一个父类通常要提供默认构造方法的原因； 
2，初始化非静态变量； 
3，构造代码块。 
由此可知，构造代码块优先于构造方法的方法体，但是this关键字跟super关键字不能同时出现，而且只能在代码的第一行。如果出现了this关键字，隐式三步就不会执行。 
例如，分析下面的代码及执行结果，已经用注释标出了执行步骤Step 1–Step 7。 
也就是说，当递归调用多个构造方法的时候，构造代码块只会在最后的（也即方法体第一行不是this语句的）那个构造方法执行之前执行！
 * @author zyj
 *
 */

import java.util.HashMap;
import java.util.Map;

public class Test {

	 public static int a = 0;
	 public static Map<String, String> map=new HashMap<String, String>();

	    static {// Step 1
	        a = 10;
	        System.out.println("静态代码块在执行a=" + a);
	        map.put("key 11", "value 11");
	    }

	    {// Step 4
	        a = 8;
	        System.out.println("非静态代码块（构造代码块）在执行a=" + a);
	    }

	    public Test() {
	        this("调用带参构造方法1，a=" + a); // Step 2
	        System.out.println("无参构造方法在执行a=" + a);// Step 7
	    }

	    public Test(String n) {
	        this(n, "调用带参构造方法2，a=" + a); // Step 3
	        System.out.println("带参构造方法1在执行a=" + a); // Step 6
	    }

	    public Test(String s1, String s2) {
	        System.out.println(s1 + "；" + s2);// Step 5
	    }

	    public static void main(String[] args) {
	        Test t = null;// JVM加载Test类，静态代码块执行
	        System.out.println("下面new一个Test实例：");
	        t = new Test();
	    }
	}